package com.powernode.listener;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.powernode.constant.Constants;
import com.powernode.entity.Orders;
import com.powernode.service.OrderService;
import com.rabbitmq.client.Channel;
import jakarta.annotation.Resource;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Date;

/**
 * 延迟消息消费者
 * 用于处理订单超时未支付的场景，通过RabbitMQ延迟队列实现
 * 当订单在指定时间内未完成支付，将自动修改订单状态为超时未支付
 */
@Component
public class OrderDelayListener {
    @Resource
    private OrderService orderService; // 注入订单服务，用于订单状态查询和更新

    /**
     * 监听延迟队列，处理超时未支付订单
     * 当订单超时未支付时，将订单状态更新为"超时未支付"(status=2)
     * 并恢复商品库存
     *
     * @param message 消息对象，包含订单ID信息
     * @param channel 消息通道，用于消息确认
     */
    @RabbitListener(queues = Constants.QUEUE_DELAY_NAME) // 监听指定的延迟队列，队列名称从常量类获取
    public void onMessage(Message message, Channel channel) {
        // 获取消息体内容，即订单ID
        String orderId = new String(message.getBody());

        // 根据订单ID查询订单信息
        Orders orders = orderService.getById(Integer.parseInt(orderId));

        // 判断订单状态是否为未支付(status=0)
        if (orders.getStatus() == 0) {
            // 创建更新条件对象
            UpdateWrapper<Orders> updateWrapper = new UpdateWrapper<>();
            // 设置订单状态为2(超时未支付)
            updateWrapper.set("status", 2);
            // 设置更新时间为当前时间
            updateWrapper.set("update_time", new Date());
            // 设置更新条件为订单ID
            updateWrapper.eq("id", orders.getId());

            // 执行更新操作
            orderService.update(updateWrapper);
        }

        // 手动确认消息已消费
        try {
            // 确认消息，第二个参数false表示不批量确认
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (IOException e) {
            // 异常处理，将IO异常转换为运行时异常抛出
            throw new RuntimeException(e);
        }
    }
}
